/*
 * CS_JOIN_GUILD.cpp
 *
 *  Created on: 2014. 7. 31.
 *      Author: spencer
 */




#include "../../User.h"
#include "../../Command.h"
#include "../../Proxy.h"
#include "../../NState/Static.h"

#include "../protocol/Guild.h"

namespace ProjectZ { namespace NCommand {

void Command::CS_JOIN_GUILD(User * pUser, ::Network::Packet * pPacket)
{
/*
CS_GUILD_APPLY_ADMISSION			0x3220
{
	u32				u32guild_seq;
	str				strPassword;				// 패스워드 필요한 길드의 경우 체크
}

SC_GUILD_APPLY_ADMISSION			0x3221
{
	s16				s16ack;			/// ACK_OK: 성공
									///	ACK_GUILD_USER_OVER			= 3610,	// 가입신청 시 길드 가입인원이 초과된 경우
									///	ACK_GUILD_TIME_ERROR,				// 가입신청 시 재가입 시간 경고
									///	ACK_GUILD_ALREADY_REQUEST,			// 가입신청 시 이미 가입신청된 길드
									///	ACK_GUILD_NOT_GUEST,				// 가입신청 시 길드에 가입된 유저일 경우
									///	ACK_GUILD_REQUEST_OVER,				// 가입신청 시 가입신청 한 길드가 3개 초과된 경우
									/// ACK_GUILD_NOT_RECRUIT,				// 가입신청 시 해당 길드의 모집이 중단된 경우
}
*/
	PREPARE_PACKET;
	uint32_t guild_seq;
	Toolkit::Str<8> strPassword;

	*pPacket >> guild_seq >> strPassword;

	if (0 < pUser->GetUserInfo().guild_seq || 0 >= guild_seq)
	{
		::Network::Packet * pAck = ::Network::GETPACKETPOOL()->SEND_NEW();
		*pAck << static_cast<int16_t>(ACK_UNKNOWN_ERROR);
		pAck->MakePacket(CMD_SC_GUILD_APPLY_ADMISSION);
		pUser->Send(pAck);
		return;
	}

	JoinGuildSyn syn;
	syn.user_seq	= pUser->GetUserSeq();
	syn.guild_seq = guild_seq;
	syn.password = strPassword.c_str();
	syn.level = pUser->GetCharacterInfo().level;
	syn.server_id = ::ProjectZ::Config::Instance().GetResourceDatabase()._channelUniqueIndex;
	syn.socialid = atoll(pUser->GetSocialID().c_str());
	syn.nickname = pUser->GetUserNickName().c_str();
	syn.profile_url = pUser->GetUserInfo().profile_url.c_str();

//	DEBUGLOG("%s> user_seq: %d, guild_seq: %d, password: %s, level: %d, server_id: %d, socialid: %d, nickname: %s, profile_url: %s"
//			, __FUNCTION__
//			, syn.user_seq, syn.guild_seq, syn.password.c_str()
//			, syn.level, syn.server_id, syn.socialid, syn.nickname.c_str(), syn.profile_url.c_str()
//			);

	if (false == NProxy::SendGuildServer(pUser, syn))
	{
		::Network::Packet * pAck = ::Network::GETPACKETPOOL()->SEND_NEW();
		*pAck << static_cast<int16_t>(ACK_UNKNOWN_ERROR);
		pAck->MakePacket(CMD_SC_GUILD_APPLY_ADMISSION);
		pUser->Send(pAck);
		return;
	}

	pUser->SetState(NState::Static::Instance().WAITGUILDINFO());
}

} /*NCommand*/ } /*ProjectZ*/
